// 各模块调用js,有一部分涉及ajax调用数据，涉及到是否登录的问题，所以js分为公共部分和单独部分
$(function() {
	// $('.goodsImg').lazyload({ effect: "fadeIn",failurelimit : 10,skip_invisible : false,threshold: 100});//商品默认图片
	// $('.shopImg').lazyload({ effect: "fadeIn",failurelimit : 10,skip_invisible : false,threshold: 100});//店铺默认头像
	// $('.usersImg').lazyload({ effect: "fadeIn",failurelimit : 10,skip_invisible : false,threshold: 100});//会员默认头像
	// $('.lazy-loading').lazyload({ effect: "fadeIn",failurelimit : 10,skip_invisible : false,threshold: 100});//其他图片懒加载
	// 初始化页面消息
	ZHT.initVisitor();
});
/**
 * 上传图片
 */
ZHT.upload = function(opts){	
  var _opts = {};
  _opts = $.extend(_opts,{duplicate:true,auto: true,compress:false,swf: ZHT.conf.STATIC +'/plugins/webuploader/Uploader.swf',server:ZHT.U('home/base/uploadPic')},opts);
  var uploader = WebUploader.create(_opts);
  uploader.on('uploadSuccess', function( file,response ) {
		// console.log(response);
		var json = ZHT.toJson(response._raw);
		// var json = response;
		if(_opts.callback)_opts.callback(json,file);
  });
  uploader.on('uploadError', function( file ) {
    if(_opts.uploadError)_opts.uploadError();
  });
  uploader.on('uploadProgress', function( file, percentage ) {
    percentage = percentage.toFixed(2)*100;
    if(_opts.progress)_opts.progress(percentage);
  });
    return uploader;
}
/**
 * 初始化页面消息
 */
ZHT.initVisitor = function(){
	// 用户消息，每秒中刷新（购物车，用户消息等会用到）
	ZHT.getSysMessages('cart');
	if(ZHT.conf.TIME_TASK=='1'){
		setInterval(function(){
			ZHT.getSysMessages('cart');
		},10000); // 10秒循环
	}
	// 导航商品分类下拉菜单
	ZHT.Sidebar(); 
	// 面包屑导航商品分类下拉菜单
	ZHT.showCategoryNavs();
	// 头部搜索，商品和商家下拉菜单
	ZHT.searchIpt();
}
// 记录当前页url，传到后台，记录session,登录之后返回页面要用
ZHT.currentUrl = function(url){
	if(!url)var url = window.location.href;
	$.post(ZHT.U('home/index/currentUrl'),{url:url},function(data){});
}
/**
 * 获取用户信息
 */
ZHT.getSysMessages = function(val){
	if(ZHT.conf.IS_LOGIN==0)return;
	$.post(ZHT.U('home/index/getSysMessages'),{tasks:val},function(data){
		var json = ZHT.toJson(data);
		if(json.message){
			$('#wst-user-messages').html(json.message.num);
			if(parseInt(json.message.num,10)>0){
				$('#wst-user-messages').css('color','red');
				if($('.j-message-count')[0])$('.j-message-count').show().html(json.message.num);
				if($('#mId_'+json.message.id)[0])$('#mId_'+json.message.id).addClass('wst-msg-tips-box').html(json.message.num);
				if($('#mId_'+json.message.sid)[0])$('#mId_'+json.message.sid).addClass('wst-msg-tips-box').html(json.message.num);
			}else{
				$('#wst-user-messages').css('color','#666');
				if($('.j-message-count')[0])$('.j-message-count').hide();
				if($('#mId_'+json.message.id)[0])$('#mId_'+json.message.id).removeClass('wst-msg-tips-box').html('');
			}
		}
		if(json.cart){
			// console.log(json.cart.goods);
			if(json.cart.goods>0){
				$('#goodsTotalNum').show();
				$('#goodsTotalNum').html(json.cart.goods);
			}else{
				$('#goodsTotalNum').hide();
			}
			// 右侧悬浮购物车
			// if(json.cart.goods>0){
			//   if($('.j-cart-count')[0])$('.j-cart-count').show().html(json.cart.goods);
			// }else{
			// 	if($('.j-cart-count')[0])$('.j-cart-count').hide().html('');
			// }
		}
		if(json.userorder){
			for(var key in json.userorder){
				if($('#mId_'+key)[0]){
					if(json.userorder[key]!='0'){
					  $('#mId_'+key).addClass('wst-msg-tips-box').html(json.userorder[key]);
					}else{
						$('#mId_'+key).removeClass('wst-msg-tips-box').html('');
					}
				}
			}
		}
	});
}
/**
 * 删除购物车商品
 */
ZHT.delCart = function(id){
	ZHT.confirm({content:'您确定要删除该商品吗？',yes:function(index){
		$.post(ZHT.U('home/cart/delCart'),{id:id,rnd:Math.random()},function(data,textStatus){
		     var json = ZHT.toJson(data);
		     if(json.status==1){
		    	 ZHT.msg(json.msg,{icon:1});
		         location.href=ZHT.U('home/cart/index');
		     }else{
		    	 ZHT.msg(json.msg,{icon:2});
		     }
		});
	}});
}
/**
 * 改变购物车商品数量
 */
ZHT.changeIptNum = function(diffNum,iptId,btnId,id,func){
	var suffix = (id)?"_"+id:"";
	var iptElem = $(iptId+suffix);
	var minVal = parseInt(iptElem.attr('data-min'),10);
	var maxVal = parseInt(iptElem.attr('data-max'),10);
	var tmp = 0;
	if(maxVal<minVal){
		tmp = maxVal;
		maxVal = minVal;
		minVal = tmp;
	}
	var num = parseInt(iptElem.val(),10);
	num = num?num:1;
	num = num + diffNum;
	btnId = btnId.split(',');
	$(btnId[0]+suffix).css('color','#666');
	$(btnId[1]+suffix).css('color','#666');
	if(minVal>=num){
		num=minVal;
		$(btnId[0]+suffix).css('color','#f1f1f1');
	}
	if(maxVal<=num){
		num=maxVal;
		$(btnId[1]+suffix).css('color','#f1f1f1');
	}
	iptElem.val(num);
	if(suffix!='')ZHT.changeCartGoods(id,num,-1);
	if(func){
		var fn = window[func];
		fn();
	}
}
/**
 * 改变购物车数据库商品数量
 */
ZHT.changeCartGoods = function(id,buyNum,isCheck){
	$.post(ZHT.U('home/cart/changeCartGoods'),{id:id,isCheck:isCheck,buyNum:buyNum,rnd:Math.random()},function(data,textStatus){
	     var json = ZHT.toJson(data);
	     if(json.status!=1){
	    	 ZHT.msg(json.msg,{icon:2});
	     }
	});
}
/**
 * 循环调用及设置商品分类
 * @param id           当前分类ID
 * @param val          当前分类值
 * @param childIds     分类路径值【数组】
 * @param isRequire    是否要求必填
 * @param className    样式，方便将来获取值
 * @param beforeFunc   运行前回调函数
 * @param afterFunc    运行后回调函数
 * @param lastLevel    限制分类展开的级别，值为2只显示1级和2级分类，如果不设置，默认显示3级分类
 * var opts = {id:'bcat_0',val:catIdPath[0],childIds:catIdPath,className:'goodsCat'}
 * childIds值是[1,3,4,5,'']和[1,3,4,5]的区别？没有区别，因为当{parentId:opts.val}是5的时候，已经没有下级分类了
 */
 ZHT.setGoodsCat = function(opts){
	opts.lastLevel = opts.lastLevel ? opts.lastLevel : 3;
	var obj = $('#' + opts.id); // 根据传来的id获取下拉框
	obj.attr('lastgoodscat',1); // 下拉框指定lastgoodscat属性
	var level = obj.attr('level') ? (parseInt(obj.attr('level'),10) + 1) : 1;
	if(opts.childIds.length > 0){		
		opts.childIds.shift(); // 传来的catId数组，删除数组的第一个元素
		if(opts.beforeFunc){
			if(typeof(opts.beforeFunc)=='function'){
				opts.beforeFunc({id:opts.id,val:opts.val});
			}else{
			   var fn = window[opts.beforeFunc];
			   fn({id:opts.id,val:opts.val});
			}
		}
		if(level < opts.lastLevel){
			$.post(ZHT.U('home/goodsCat/listQuery'),{parentId:opts.val},function(data,textStatus){
				var json = ZHT.toJson(data);
				// {parentId:opts.val}是5的时候，已经没有下级分类了,不会再次执行ZHT.setGoodsCat(opts);了
				if(json.data && json.data.length > 0){
					json = json.data;
					var html = [];
					var tid = opts.id + "_" + opts.val;
					html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
					html.push("<option value='' >请选择</option>");
					for (var i = 0; i < json.length; i++) {
						var cat = json[i];
						html.push("<option value='" + cat.catId + "' "+ ((opts.childIds[0] == cat.catId) ? "selected" : "") + ">" + cat.catTitle + "</option>"); // 这里的opts.childIds[0]，应该是上面opts.childIds.shift()删除第一项之后，新的第一项了
					}
					html.push("</select>");
					$(html.join('')).insertAfter(obj);
					var tidObj = $('#' + tid); // 获取上面通过ajax调取数据生成的新的下拉框
					// 如果下拉框选中值不为空，则要考虑是否还有下级下拉框
					if(tidObj.val() != ''){
						obj.removeAttr('lastgoodscat'); // 移除上级下拉框的lastgoodscat属性
						tidObj.attr('lastgoodscat',1); // 给该下拉框添加lastgoodscat属性
						opts.id = tid;
						opts.val = tidObj.val();
						ZHT.setGoodsCat(opts);
					}
					// 给该新生成的下拉框添加change事件，改变选项，生成新的下级下拉框
					tidObj.change(function(){
						opts.id = tid;
						opts.val = $(this).val();
						ZHT.getGoodsCat(opts);
					 })
				}else{
					opts.isLast = true;
					opts.lastVal = opts.val;
				}
				if(opts.afterFunc){
					if(typeof(opts.afterFunc)=='function'){
						opts.afterFunc(opts);
					}else{
						var fn = window[opts.afterFunc];
						fn(opts);
					}
				}
			})
		}
		
	}
}
/**
 * 循环创建商品分类
 * @param id            当前分类ID
 * @param val           当前分类值
 * @param className     样式，方便将来获取值
 * @param isRequire     是否要求必填
 * @param beforeFunc    运行前回调函数
 * @param afterFunc     运行后回调函数
 * @param lastLevel    限制分类展开的级别，值为2只显示1级和2级分类，如果不设置，默认显示3级分类
 * <select id="bcat_0" class='ipt goodsCats' level="0" onchange="ZHT.ITGoodsCats({id:'bcat_0',val:this.value,isRequire:false,className:'goodsCat'});" data-rule='所属商品分类:required;' data-target="#msg_bcat_0">
 */
ZHT.getGoodsCat = function(opts){
	opts.className = opts.className ? opts.className : "goodsCat";
	opts.lastLevel = opts.lastLevel ? opts.lastLevel : 3;
	var obj = $('#' + opts.id);
	obj.attr('lastgoodscat',1);
	var level = parseInt(obj.attr('level'),10) + 1; // 最开始obj的level为0，+1后得到level=1
	$("select[id^='"+opts.id+"_']").remove(); // 凡是id这样开头的bcat_0_，都移除，这样是改变上级分类的时候，之前的下级分类要移除
	if(opts.beforeFunc){
		if(typeof(opts.beforeFunc)=='function'){
			opts.beforeFunc({id:opts.id,val:opts.val});
		}else{
		  var fn = window[opts.beforeFunc];
		  fn({id:opts.id,val:opts.val});
		}
	}
	opts.lastVal = opts.val;
	if(opts.val == ''){ // 如果选择该下拉框的值为空，就是不选了		
		obj.removeAttr('lastgoodscat'); // 移除属性lastgoodscat，该下拉框就不是最后一级分类了
		var lastId = 0,level = 0,tmpLevel = 0,lastObjId;
		// 循环所有className为goodsCat的下拉框
		$('.' + opts.className).each(function(){
			tmpLevel = parseInt($(this).attr('level'),10); // 临时存储循环下拉菜单级别level，tmpLevel第一级为0，第二级为1，第三级为2
			// console.log(level + '来啦1');
			// console.log(tmpLevel + '来啦2');
			if(level <= tmpLevel && $(this).val() != ''){ // 如果是一级下拉level=0,tmpLevel=0,第一个条件满足，第二个条件不满足
			// 这个if语句，对一级下拉不管用，如果是二级下拉选择为空了，则一级下拉满足该if语句的条件，则level,lastId,lastObjId都顺应变成一级下拉的值了
				level = tmpLevel;
				lastId = $(this).val();
				lastObjId = $(this).attr('id');
				// console.log('来啦3');
				// return;
			}
		})
		$('#' + lastObjId).attr('lastgoodcat',1); // 如果下级下拉选择为空了，则属性lastgoodcat顺应的移到上级下拉。不管原来是在下面第几级
		// 下面是为ajax准备参数值
		opts.id = lastObjId; // 下拉框id
		opts.val = $('#' + lastObjId).val(); // 下拉框选中的值
		opts.isLast = true; // 不知道什么用
		opts.lastVal = opts.val; // 不知道什么用
		if (opts.afterFunc) {
			if (typeof (opts.afterFunc) == 'function') {
				opts.afterFunc(opts);
			} else {
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
		return;
	}
	// console.log(opts);
	// console.log(ZHT.U('home/goodsCat/listQuery'));
	if(level < opts.lastLevel){
		$.post(ZHT.U('home/goodsCat/listQuery'),{parentId:opts.val},function(data,textStatus){
			var json = ZHT.toJson(data);
			// console.log(json);
			if(json.data && json.data.length > 0){
				json = json.data;
				var html = [];
				var tid = opts.id + "_" + opts.val; // 上级下拉框的id和选中值组合作为下级下拉框的id
				html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
				html.push("<option value='' >请选择</option>");
				for (var i = 0; i < json.length; i++) {
					var cat = json[i];
					html.push("<option value='" + cat.catId + "'>" + cat.catTitle + "</option>");
				}
				html.push("</select>");
				$(html.join('')).insertAfter(obj);
				// 给新生成的下拉框增加change事件，下拉框改变时，继续生成下级下拉框
				$('#' + tid).change(function(){
					opts.id = tid;
					opts.val = $(this).val();
					// 如果下级下拉框改变，则移除上级下拉框的lastgoodscat属性，然后调用ZHT.getGoodsCat函数的时候，再给本下拉框加上lastgoodscat属性
					if(opts.val != ''){
						obj.removeAttr('lastgoodscat');
					}
					ZHT.getGoodsCat(opts);
				})
			}else{
				opts.isLast = true;
				opts.lastVal = opts.val;
			}
			if(opts.afterFunc){
				if(typeof(opts.afterFunc)=='function'){
					opts.afterFunc(opts);
				}else{
					var fn = window[opts.afterFunc];
					fn(opts);
				}
			}
		})
	}
	
}
/**
 * 获取最后分类值
 */
ZHT.getGoodsCatId = function(className){
	var catId = '';
	$('.'+className).each(function(){
		if($(this).attr('lastgoodscat')=='1')catId = $(this).val();
	});
	return catId;
}
/**
 * 获取最后分类的IdPath
 */
ZHT.getGoodsCatIdPath = function(srcObj,className){
	var catIdPath = '';
	$('.'+className).each(function(){
		if($(this).attr('lastgoodscat')=='1')catIdPath = $(this).attr('id')+'_'+$(this).val()+'_';
	});
	catIdPath = catIdPath.replace(srcObj+'_','');
	return catIdPath;
}
/**
 * 循环调用及设置地区
 * @param id           当前地区ID
 * @param val          当前地区值
 * @param childIds     地区路径值【数组】
 * @param isRequire    是否要求必填
 * @param className    样式，方便将来获取值
 * @param beforeFunc   运行前回调函数
 * @param afterFunc    运行后回调函数
 * var opts = {id:'area_0',val:areaIdPath[0],childIds:areaIdPath,className:'Area'}
 * childIds值是[1,3,4,5,'']和[1,3,4,5]的区别？没有区别，因为当{parentId:opts.val}是5的时候，已经没有下级地区了
 */
 ZHT.setArea = function(opts){
	var obj = $('#' + opts.id); // 根据传来的id获取下拉框
	obj.attr('lastarea',1); // 下拉框指定lastarea属性
	var level = obj.attr('level') ? (parseInt(obj.attr('level'),10) + 1) : 1;
	if(opts.childIds.length > 0){		
		opts.childIds.shift(); // 传来的areaId数组，删除数组的第一个元素
		if(opts.beforeFunc){
			if(typeof(opts.beforeFunc)=='function'){
				opts.beforeFunc({id:opts.id,val:opts.val});
			}else{
			   var fn = window[opts.beforeFunc];
			   fn({id:opts.id,val:opts.val});
			}
		}
		$.post(ZHT.U('home/Area/listQuery'),{parentId:opts.val},function(data,textStatus){
			var json = ZHT.toJson(data);
			// {parentId:opts.val}是5的时候，已经没有下级地区了,不会再次执行ZHT.setArea(opts);了
			if(json.data && json.data.length > 0){
				json = json.data;
				var html = [];
				var tid = opts.id + "_" + opts.val;
				html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
				html.push("<option value='' >请选择</option>");
				for (var i = 0; i < json.length; i++) {
					var cat = json[i];
					html.push("<option value='" + cat.areaId + "' "+ ((opts.childIds[0] == cat.areaId) ? "selected" : "") + ">" + cat.areaName + "</option>"); // 这里的opts.childIds[0]，应该是上面opts.childIds.shift()删除第一项之后，新的第一项了
				}
				html.push("</select>");
				$(html.join('')).insertAfter(obj);
				var tidObj = $('#' + tid); // 获取上面通过ajax调取数据生成的新的下拉框
				// 如果下拉框选中值不为空，则要考虑是否还有下级下拉框
				if(tidObj.val() != ''){
					obj.removeAttr('lastarea'); // 移除上级下拉框的lastarea属性
					tidObj.attr('lastarea',1); // 给该下拉框添加lastarea属性
					opts.id = tid;
					opts.val = tidObj.val();
					ZHT.setArea(opts);
				}
				// 给该新生成的下拉框添加change事件，改变选项，生成新的下级下拉框
				tidObj.change(function(){
					opts.id = tid;
					opts.val = $(this).val();
					ZHT.getArea(opts);
			 	})
			}else{
				opts.isLast = true;
				opts.lastVal = opts.val;
			}
			if(opts.afterFunc){
				if(typeof(opts.afterFunc)=='function'){
					opts.afterFunc(opts);
				}else{
					var fn = window[opts.afterFunc];
					fn(opts);
				}
			}
		})
	}
}
/**
 * 循环创建地区
 * @param id            当前地区ID
 * @param val           当前地区值
 * @param className     样式，方便将来获取值
 * @param isRequire     是否要求必填
 * @param beforeFunc    运行前回调函数
 * @param afterFunc     运行后回调函数
 * <select id="area_0" class='ipt Areas' level="0" onchange="ZHT.ITAreas({id:'area_0',val:this.value,isRequire:false,className:'Area'});" data-rule='所属地区:required;' data-target="#msg_area_0">
 */
ZHT.getArea = function(opts){
	opts.className = opts.className ? opts.className : "Area";
	var obj = $('#' + opts.id);
	obj.attr('lastarea',1);
	var level = parseInt(obj.attr('level'),10) + 1; // 最开始obj的level为0，+1后得到level=1
	$("select[id^='"+opts.id+"_']").remove(); // 凡是id这样开头的area_0_，都移除，这样是改变上级地区的时候，之前的下级地区要移除
	if(opts.beforeFunc){
		if(typeof(opts.beforeFunc)=='function'){
			opts.beforeFunc({id:opts.id,val:opts.val});
		}else{
		  var fn = window[opts.beforeFunc];
		  fn({id:opts.id,val:opts.val});
		}
	}
	opts.lastVal = opts.val;
	if(opts.val == ''){ // 如果选择该下拉框的值为空，就是不选了		
		obj.removeAttr('lastarea'); // 移除属性lastarea，该下拉框就不是最后一级地区了
		var lastId = 0,level = 0,tmpLevel = 0,lastObjId;
		// 循环所有className为Area的下拉框
		$('.' + opts.className).each(function(){
			tmpLevel = parseInt($(this).attr('level'),10); // 临时存储循环下拉菜单级别level，tmpLevel第一级为0，第二级为1，第三级为2
			// console.log(level + '来啦1');
			// console.log(tmpLevel + '来啦2');
			if(level <= tmpLevel && $(this).val() != ''){ // 如果是一级下拉level=0,tmpLevel=0,第一个条件满足，第二个条件不满足
			// 这个if语句，对一级下拉不管用，如果是二级下拉选择为空了，则一级下拉满足该if语句的条件，则level,lastId,lastObjId都顺应变成一级下拉的值了
				level = tmpLevel;
				lastId = $(this).val();
				lastObjId = $(this).attr('id');
				// console.log('来啦3');
				// return;
			}
		})
		$('#' + lastObjId).attr('lastarea',1); // 如果下级下拉选择为空了，则属性lastarea顺应的移到上级下拉。不管原来是在下面第几级
		// 下面是为ajax准备参数值
		opts.id = lastObjId; // 下拉框id
		opts.val = $('#' + lastObjId).val(); // 下拉框选中的值
		opts.isLast = true; // 不知道什么用
		opts.lastVal = opts.val; // 不知道什么用
		if (opts.afterFunc) {
			if (typeof (opts.afterFunc) == 'function') {
				opts.afterFunc(opts);
			} else {
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
		return;
	}
	// console.log(opts);
	$.post(ZHT.U('home/Area/listQuery'),{parentId:opts.val},function(data,textStatus){
		var json = ZHT.toJson(data);
		// console.log(json);
		if(json.data && json.data.length > 0){
			json = json.data;
			var html = [];
			var tid = opts.id + "_" + opts.val; // 上级下拉框的id和选中值组合作为下级下拉框的id
			html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
			html.push("<option value='' >请选择</option>");
			for (var i = 0; i < json.length; i++) {
				var cat = json[i];
				html.push("<option value='" + cat.areaId + "'>" + cat.areaName + "</option>");
			}
			html.push("</select>");
			$(html.join('')).insertAfter(obj);
			// 给新生成的下拉框增加change事件，下拉框改变时，继续生成下级下拉框
			$('#' + tid).change(function(){
				opts.id = tid;
				opts.val = $(this).val();
				// 如果下级下拉框改变，则移除上级下拉框的lastarea属性，然后调用ZHT.getArea函数的时候，再给本下拉框加上lastarea属性
				if(opts.val != ''){
					obj.removeAttr('lastarea');
				}
				ZHT.getArea(opts);
			})
		}else{
			opts.isLast = true;
	    opts.lastVal = opts.val;
		}
		if(opts.afterFunc){
			if(typeof(opts.afterFunc)=='function'){
				opts.afterFunc(opts);
			}else{
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
	})
}
/**
 * 循环创建地区
 * @param id            当前地区ID
 * @param val           当前地区值
 * @param className     样式，方便将来获取值
 * @param isRequire     是否要求必填
 * @param beforeFunc    运行前回调函数
 * @param afterFunc     运行后回调函数
 * <select id="area_0" class='ipt Areas' level="0" onchange="ZHT.ITAreas({id:'area_0',val:this.value,isRequire:false,className:'Area'});" data-rule='所属地区:required;' data-target="#msg_area_0">
 */
ZHT.getComplaints = function(opts){
	opts.className = opts.className ? opts.className : "Area";
	var obj = $('#' + opts.id);
	obj.attr('lastarea',1);
	var level = parseInt(obj.attr('level'),10) + 1; // 最开始obj的level为0，+1后得到level=1
	$("select[id^='"+opts.id+"_']").remove(); // 凡是id这样开头的area_0_，都移除，这样是改变上级地区的时候，之前的下级地区要移除
	if(opts.beforeFunc){
		if(typeof(opts.beforeFunc)=='function'){
			opts.beforeFunc({id:opts.id,val:opts.val});
		}else{
		  var fn = window[opts.beforeFunc];
		  fn({id:opts.id,val:opts.val});
		}
	}
	opts.lastVal = opts.val;
	if(opts.val == ''){ // 如果选择该下拉框的值为空，就是不选了		
		obj.removeAttr('lastarea'); // 移除属性lastarea，该下拉框就不是最后一级地区了
		var lastId = 0,level = 0,tmpLevel = 0,lastObjId;
		// 循环所有className为Area的下拉框
		$('.' + opts.className).each(function(){
			tmpLevel = parseInt($(this).attr('level'),10); // 临时存储循环下拉菜单级别level，tmpLevel第一级为0，第二级为1，第三级为2
			// console.log(level + '来啦1');
			// console.log(tmpLevel + '来啦2');
			if(level <= tmpLevel && $(this).val() != ''){ // 如果是一级下拉level=0,tmpLevel=0,第一个条件满足，第二个条件不满足
			// 这个if语句，对一级下拉不管用，如果是二级下拉选择为空了，则一级下拉满足该if语句的条件，则level,lastId,lastObjId都顺应变成一级下拉的值了
				level = tmpLevel;
				lastId = $(this).val();
				lastObjId = $(this).attr('id');
				// console.log('来啦3');
				// return;
			}
		})
		$('#' + lastObjId).attr('lastarea',1); // 如果下级下拉选择为空了，则属性lastarea顺应的移到上级下拉。不管原来是在下面第几级
		// 下面是为ajax准备参数值
		opts.id = lastObjId; // 下拉框id
		opts.val = $('#' + lastObjId).val(); // 下拉框选中的值
		opts.isLast = true; // 不知道什么用
		opts.lastVal = opts.val; // 不知道什么用
		if (opts.afterFunc) {
			if (typeof (opts.afterFunc) == 'function') {
				opts.afterFunc(opts);
			} else {
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
		return;
	}
	// console.log(opts);
	$.post(ZHT.U('home/index/listQuery'),{parentId:opts.val},function(data,textStatus){
		var json = ZHT.toJson(data);
		console.log(json);
		if(json.data && json.data.length > 0){
			json = json.data;
			var html = [];
			var tid = opts.id + "_" + opts.val; // 上级下拉框的id和选中值组合作为下级下拉框的id
			html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
			html.push("<option value='' >请选择</option>");
			for (var i = 0; i < json.length; i++) {
				var cat = json[i];
				html.push("<option value='" + cat.ct_id + "'>" + cat.name + "</option>");
			}
			html.push("</select>");
			$(html.join('')).insertAfter(obj);
			// 给新生成的下拉框增加change事件，下拉框改变时，继续生成下级下拉框
		}else{
			opts.isLast = true;
	    opts.lastVal = opts.val;
		}
		if(opts.afterFunc){
			if(typeof(opts.afterFunc)=='function'){
				opts.afterFunc(opts);
			}else{
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
	})
}
/**
 * 获取最后地区值
 */
ZHT.getAreaId = function(className){
	var areaId = '';
	$('.'+className).each(function(){
		if($(this).attr('lastarea')=='1')areaId = $(this).val();
	});
	return areaId;
}
/**
 * 获取最后地区的IdPath
 */
ZHT.getAreaIdPath = function(srcObj,className){
	var areaIdPath = '';
	$('.'+className).each(function(){
		if($(this).attr('lastarea')=='1')areaIdPath = $(this).attr('id')+'_'+$(this).val()+'_';
	});
	areaIdPath = areaIdPath.replace(srcObj+'_','');
	return areaIdPath;
}
ZHT.position = function(mid,mtype){
	$.post(ZHT.U('home/index/position'),{menuId:mid,menuType:mtype},function(data){});
}
/**
 * 头部搜索，商品和商家下拉菜单
 */
ZHT.searchIpt = function(){
	$('.j-search-box').hover(function(){
		$(".j-type-list").show();
		$(this).find('i').removeClass('arrow').addClass('over');
		$(this).css({"border-left":"1px solid #D4D4D4;"});
	},function(){
		$(".j-type-list").hide();
		$(this).css({"border-left":"1px solid #D4D4D4;"});
		$(this).find('i').removeClass('over').addClass('arrow');
	});

	$('j-type-list').hover(function(){
		$(".j-type-list").show();
		$(this).find('i').removeClass('arrow').addClass('over');
		$(this).css({"border-left":"1px solid #D4D4D4;"});
	});

	$(".j-type-list div").click(function(){
		$("#search-type").val($(this).attr("data"));
		$(".j-search-type span").html($(this).html());
		if($(this).attr("data")==1){
			$(this).attr("data",0);
			$(this).html('商品');
			$('#search-ipt').attr('placeholder',$('#adsShopWordsSearch').val());
		}else{
			$(this).attr("data",1);
			$(this).html('店铺');
			$('#search-ipt').attr('placeholder',$('#adsGoodsWordsSearch').val());
		}
		$(".j-type-list").hide();
		$(".j-search-type").find('i').removeClass('over').addClass('arrow');
	});
}
/**
 * 头部搜索，包括商品和商家
 */
ZHT.search = function(){
	if($("#search-type").val()==1){
		ZHT.shopSearch($.trim($('#search-ipt').val()));
	}else{
		ZHT.goodsSearch($.trim($('#search-ipt').val()));
	}
}
ZHT.shopSearch = function(v){
	location.href = ZHT.U('home/shop/lists','keyword='+v,true);
}
ZHT.goodsSearch = function(v){
	location.href = ZHT.U('home/goods/search','keyword='+v,true);
}
/**
 * 导航商品分类下拉菜单
 */
ZHT.Sidebar = function(){
	if(!$('#wst-categorys')[0])return;

	if(!$('#wst-categorys').hasClass('j-index')){
		ZHT.dropDownLayer("#wst-categorys",".j-cate-dd");
	}
	$(".dd-inner").children(".item").hover(function() { //一级导航悬浮
		$('.categeMenuImg').lazyload({ effect: "fadeIn",failurelimit : 10,skip_invisible : false,threshold: 100,placeholder:window.conf.RESOURCE_PATH+'/'+window.conf.GOODS_LOGO});//默认图片
		$(this).parent().find('.over-cat').show();

        $(this).addClass("hover").siblings(".item").removeClass("hover");
        var index = $(this).index();
        $(".dorpdown-layer").children(".item-sub").hide();
        $(".dorpdown-layer").children(".item-sub").eq(index).show();

        var start = $('.j-cate-dt').offset().top;
        var obj = $('#index_menus_sub');
        var sh = document.documentElement.scrollTop || document.body.scrollTop; // 滚动条距离顶部高度
        if(sh>start+36){
	            var start = sh-start;
        }else{
        	var start = 36;
        }
        //obj.stop().animate({ "top": start });
        obj.css('top',start);


    },function(){
    	$(this).parent().find('.over-cat').hide();
    });



    $('.over-cat-icon').parent().mouseover(function(){
    	 $(this).find('.over-cat-icon').addClass('over-cat-icon-hover');
    });
     $('.over-cat-icon').parent().mouseout(function(){
    	$(this).find('.over-cat-icon').removeClass('over-cat-icon-hover');
    });

    $(".dd-inner").children(".item").mouseover(function() {

    	$('.dd-inner').find('.over-cat').show();

        var iCon = $(this).attr('id');
        $('.'+iCon).addClass(iCon+'-hover');
    });
    $(".dd-inner").children(".item").mouseout(function() {

    	$('.dd-inner').find('.over-cat').hide();

        var iCon = $(this).attr('id');
        $('.'+iCon).removeClass(iCon+'-hover');
    });

    $("#index_menus_sub").hover(function(){
    	$('.dd-inner').find('.over-cat').show();
    	$(this).show();
    },function(){
    	$(this).hide();
    	$('.dd-inner').find('.over-cat').hide();
    });
    $(".dd-inner").hover(function() { //整个导航菜单悬浮，是否显示二级导航到出厂
        $("#index_menus_sub").show();

    }, function() {
        $("#index_menus_sub").hide();
        $('.item').removeClass("hover");
    })
    $("#index_menus_sub").children(".item-sub").hover(function() { //二级导航悬浮
        var index = $(this).index();
        $(".dd-inner").children(".item").eq(index).addClass("hover");
        $("#index_menus_sub").show();
        var i = index+1;
        $('.cat-icon-'+i).addClass('cat-icon-'+i+'-hover');
    }, function() {
        $("#index_menus_sub").hide();
        $(".dd-inner").children(".item").removeClass("hover");
        var index = $(this).index();
        var i = index+1;
        $('.cat-icon-'+i).removeClass('cat-icon-'+i+'-hover');

    });

    $('.fore2').hover(function(){
	$(this).children('dt').css('background-color','#ff6a53');
	},function(){
		$(this).children('dt').css('background-color','');
	});
}
/**
 * 面包屑导航商品分类下拉菜单-展开折叠
 */
ZHT.showCategoryNavs = function(){
	if($('.wst-filters')[0]){
		$(".drop-down").hover(function(){
			$(this).addClass("hover");
		},function(){
			$(this).removeClass("hover");
		});
		$(".dorp-down-layer").hover(function(){
			$(this).prev().addClass("hover");
		},function(){
			$(this).prev().removeClass("hover");
		});
	}
}
/**
 * 导航商品分类下拉菜单-展开折叠
 */
ZHT.dropDownLayer = function(dropdown,layer){
	$(dropdown).hover(function () {
        $(this).find(layer).show();
    }, function () {
    	$(this).find(layer).hide();
    });
	$(layer).hover(function () {
		$(this).find(layer).show();
    }, function () {
    	$(this).find(layer).hide();
    });
}
var layerMapIndex = 0;
ZHT.loginWindow = function(){
	ZHT.currentUrl();
	$.post(ZHT.U('home/user/toLoginBox'),{},function(data){
		if(layerMapIndex==0)layerMapIndex = ZHT.open({
			type:1,
			area:['550px','460px'],
			offset:'auto',
			title:'用户登录',
			content:data,
			yes: function(index, layero){
				layerMapIndex = 0;
			},
		    cancel:function(){
		    	layerMapIndex = 0;
		    }
		});
	});
}
$(document).keypress(function(e) {
  if(layerMapIndex > 0 && e.which == 13) {
    $('.wst-login-but').click();
  }
});
ZHT.currentUrl = function(url){
	if(!url)var url = window.location.href;
	$.post(ZHT.U('home/index/currenturl'),{url:url},function(data){});
}
/********************* 选项卡切换隐藏 **********************/
$.fn.TabPanel = function(options){
	var defaults = {tab: 0};
	var opts = $.extend(defaults, options);
	var t = this;

	$(t).find('.wst-tab-nav li').click(function(){
		$(this).addClass("on").siblings().removeClass();
		var index = $(this).index();
		$(t).find('.wst-tab-content .wst-tab-item').eq(index).show().siblings().hide();
		if(opts.callback)opts.callback(index);
	});
	$(t).find('.wst-tab-nav li').eq(opts.tab).click();
}
// 生成验证码
ZHT.getVerify = function(img){
  $(img).attr('src',ZHT.U('home/index/getVerify'));
  $("#verifyCode").val("");
}

/**
 * 循环调用及设置技工服务分类
 * @param id           当前分类ID
 * @param val          当前分类值
 * @param childIds     分类路径值【数组】
 * @param isRequire    是否要求必填
 * @param className    样式，方便将来获取值
 * @param beforeFunc   运行前回调函数
 * @param afterFunc    运行后回调函数
 * var opts = {id:'bcat_0',val:catIdPath[0],childIds:catIdPath,className:'skillServiceCat'}
 * childIds值是[1,3,4,5,'']和[1,3,4,5]的区别？没有区别，因为当{parentId:opts.val}是5的时候，已经没有下级分类了
 */
 ZHT.setSkillServiceCat = function(opts){
	var obj = $('#' + opts.id); // 根据传来的id获取下拉框
	obj.attr('lastskillservicecat',1); // 下拉框指定lastskillservicecat属性
	var level = obj.attr('level') ? (parseInt(obj.attr('level'),10) + 1) : 1;
	if(opts.childIds.length > 0){		
		opts.childIds.shift(); // 传来的catId数组，删除数组的第一个元素
		if(opts.beforeFunc){
			if(typeof(opts.beforeFunc)=='function'){
				opts.beforeFunc({id:opts.id,val:opts.val});
			}else{
			   var fn = window[opts.beforeFunc];
			   fn({id:opts.id,val:opts.val});
			}
		}
		$.post(ZHT.U('home/skillServiceCat/listQuery'),{parentId:opts.val},function(data,textStatus){
			var json = ZHT.toJson(data);
			// {parentId:opts.val}是5的时候，已经没有下级分类了,不会再次执行ZHT.setSkillServiceCat(opts);了
			if(json.data && json.data.length > 0){
				json = json.data;
				var html = [];
				var tid = opts.id + "_" + opts.val;
				html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
				html.push("<option value='' >请选择</option>");
				for (var i = 0; i < json.length; i++) {
					var cat = json[i];
					html.push("<option value='" + cat.catId + "' "+ ((opts.childIds[0] == cat.catId) ? "selected" : "") + ">" + cat.catTitle + "</option>"); // 这里的opts.childIds[0]，应该是上面opts.childIds.shift()删除第一项之后，新的第一项了
				}
				html.push("</select>");
				$(html.join('')).insertAfter(obj);
				var tidObj = $('#' + tid); // 获取上面通过ajax调取数据生成的新的下拉框
				// 如果下拉框选中值不为空，则要考虑是否还有下级下拉框
				if(tidObj.val() != ''){
					obj.removeAttr('lastskillservicecat'); // 移除上级下拉框的lastskillservicecat属性
					tidObj.attr('lastskillservicecat',1); // 给该下拉框添加lastskillservicecat属性
					opts.id = tid;
					opts.val = tidObj.val();
					ZHT.setSkillServiceCat(opts);
				}
				// 给该新生成的下拉框添加change事件，改变选项，生成新的下级下拉框
				tidObj.change(function(){
					opts.id = tid;
					opts.val = $(this).val();
					ZHT.getSkillServiceCat(opts);
			 	})
			}else{
				opts.isLast = true;
				opts.lastVal = opts.val;
			}
			if(opts.afterFunc){
				if(typeof(opts.afterFunc)=='function'){
					opts.afterFunc(opts);
				}else{
					var fn = window[opts.afterFunc];
					fn(opts);
				}
			}
		})
	}
}
/**
 * 循环创建技工服务分类
 * @param id            当前分类ID
 * @param val           当前分类值
 * @param className     样式，方便将来获取值
 * @param isRequire     是否要求必填
 * @param beforeFunc    运行前回调函数
 * @param afterFunc     运行后回调函数
 * <select id="bcat_0" class='ipt SkillServiceCats' level="0" onchange="ZHT.ITSkillServiceCats({id:'bcat_0',val:this.value,isRequire:false,className:'skillServiceCat'});" data-rule='所属技工服务分类:required;' data-target="#msg_bcat_0">
 */
ZHT.getSkillServiceCat = function(opts){
	opts.className = opts.className ? opts.className : "skillServiceCat";
	var obj = $('#' + opts.id);
	obj.attr('lastskillservicecat',1);
	var level = parseInt(obj.attr('level'),10) + 1; // 最开始obj的level为0，+1后得到level=1
	$("select[id^='"+opts.id+"_']").remove(); // 凡是id这样开头的bcat_0_，都移除，这样是改变上级分类的时候，之前的下级分类要移除
	if(opts.beforeFunc){
		if(typeof(opts.beforeFunc)=='function'){
			opts.beforeFunc({id:opts.id,val:opts.val});
		}else{
		  var fn = window[opts.beforeFunc];
		  fn({id:opts.id,val:opts.val});
		}
	}
	opts.lastVal = opts.val;
	if(opts.val == ''){ // 如果选择该下拉框的值为空，就是不选了		
		obj.removeAttr('lastskillservicecat'); // 移除属性lastskillservicecat，该下拉框就不是最后一级分类了
		var lastId = 0,level = 0,tmpLevel = 0,lastObjId;
		// 循环所有className为SkillServiceCat的下拉框
		$('.' + opts.className).each(function(){
			tmpLevel = parseInt($(this).attr('level'),10); // 临时存储循环下拉菜单级别level，tmpLevel第一级为0，第二级为1，第三级为2
			// console.log(level + '来啦1');
			// console.log(tmpLevel + '来啦2');
			if(level <= tmpLevel && $(this).val() != ''){ // 如果是一级下拉level=0,tmpLevel=0,第一个条件满足，第二个条件不满足
			// 这个if语句，对一级下拉不管用，如果是二级下拉选择为空了，则一级下拉满足该if语句的条件，则level,lastId,lastObjId都顺应变成一级下拉的值了
				level = tmpLevel;
				lastId = $(this).val();
				lastObjId = $(this).attr('id');
				// console.log('来啦3');
				// return;
			}
		})
		$('#' + lastObjId).attr('lastgoodcat',1); // 如果下级下拉选择为空了，则属性lastgoodcat顺应的移到上级下拉。不管原来是在下面第几级
		// 下面是为ajax准备参数值
		opts.id = lastObjId; // 下拉框id
		opts.val = $('#' + lastObjId).val(); // 下拉框选中的值
		opts.isLast = true; // 不知道什么用
		opts.lastVal = opts.val; // 不知道什么用
		if (opts.afterFunc) {
			if (typeof (opts.afterFunc) == 'function') {
				opts.afterFunc(opts);
			} else {
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
		return;
	}
	// console.log(opts);
	$.post(ZHT.U('home/skillServiceCat/listQuery'),{parentId:opts.val},function(data,textStatus){
		var json = ZHT.toJson(data);
		// console.log(json);
		if(json.data && json.data.length > 0){
			json = json.data;
			var html = [];
			var tid = opts.id + "_" + opts.val; // 上级下拉框的id和选中值组合作为下级下拉框的id
			html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
			html.push("<option value='' >请选择</option>");
			for (var i = 0; i < json.length; i++) {
				var cat = json[i];
				html.push("<option value='" + cat.catId + "'>" + cat.catTitle + "</option>");
			}
			html.push("</select>");
			$(html.join('')).insertAfter(obj);
			// 给新生成的下拉框增加change事件，下拉框改变时，继续生成下级下拉框
			$('#' + tid).change(function(){
				opts.id = tid;
				opts.val = $(this).val();
				// 如果下级下拉框改变，则移除上级下拉框的lastskillservicecat属性，然后调用ZHT.getSkillServiceCat函数的时候，再给本下拉框加上lastskillservicecat属性
				if(opts.val != ''){
					obj.removeAttr('lastskillservicecat');
				}
				ZHT.getSkillServiceCat(opts);
			})
		}else{
			opts.isLast = true;
	    opts.lastVal = opts.val;
		}
		if(opts.afterFunc){
			if(typeof(opts.afterFunc)=='function'){
				opts.afterFunc(opts);
			}else{
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
	})
}
/**
 * 获取最后分类值
 */
ZHT.getSkillServiceCatId = function(className){
	var catId = '';
	$('.'+className).each(function(){
		if($(this).attr('lastskillservicecat')=='1')catId = $(this).val();
	});
	return catId;
}
/**
 * 获取最后分类的IdPath
 */
ZHT.getSkillServiceCatIdPath = function(srcObj,className){
	var catIdPath = '';
	$('.'+className).each(function(){
		if($(this).attr('lastskillservicecat')=='1')catIdPath = $(this).attr('id')+'_'+$(this).val()+'_';
	});
	catIdPath = catIdPath.replace(srcObj+'_','');
	return catIdPath;
}